#ifndef GY_CLIPPINGREGION_H
#define GY_CLIPPINGREGION_H

#include <QGraphicsItem>
#include "GY_ContainerTransform.h"
#include "GY_ControlLibrary_global.h"
#include "GY_ClippingToolContainer.h"
#include <QGraphicsRectItem>

class GY_CONTROLLIBRARY_EXPORT GY_ClippingRegion : public GY_ContainerTransform
{
    Q_OBJECT
public:
    explicit Q_INVOKABLE GY_ClippingRegion(const QString &guid,QGraphicsItem *parent = nullptr);
    ~GY_ClippingRegion();
    /**
     * @brief setContainerEditPointF 设置编辑点
     */
    void setContainerEditPointF();
    //!继承基类重写
    GY_Object * copyItem(const QString &guid = QString());
    /**
     * @brief addItem 组中添加图元
     * @param item
     * @return
     */
    virtual bool addItem(GY_Object *pItem);
    /**
     * @brief removItem 移除组中的图元
     * @param guid 图元的guid
     * @return 是否移除成功
     */
    virtual bool removItem(const QString &guid);
    /**
     * @brief removItem 移除图元
     * @param pItem 图元指针
     * @return 是否移除成功
     */
    virtual bool removItem(const GY_Object *pItem);
private:
    /**
     * @brief m_pRect 剪切矩形大小
     */
    QGraphicsRectItem *m_pRect;
    /**
     * @brief m_pClippingToolContainer 内容器
     */
    GY_ClippingToolContainer* m_pClippingToolContainer;
    /**
     * @brief m_heightChange 相对移动高度
     */
    qreal m_heightChange = 0;
    /**
     * @brief m_widthChange 相对移动宽度
     */
    qreal m_widthChange = 0;
    /**
     * @brief m_oldPoint1 上次点位置
     */
    QPointF m_oldPoint1;
private:
    /**
     * @brief initializationPropertyInfo 初始化属性信息
     */
    void initializationPropertyInfo();
    /**
     * @brief UpdateDraw 更新绘制
     */
    void updateDraw();
    /**
     * @brief updatePoint1 更新点1
     * @param name 属性名称
     * @param value 点1位置
     * @return 是否更新成功
     */
    bool updatePoint1(const QString &name, const QVariant &value);
    /**
     * @brief updatePoint2 更新点2
     * @param name 属性名称
     * @param value 点2位置
     * @return 是否更新成功
     */
    bool updatePoint2(const QString &name, const QVariant &value);
    /**
     * @brief updateEnableClipping 更新是否剪切
     * @param name 属性名称
     * @param value bool值
     * @return 是否更新成功
     */
    bool updateEnableClipping(const QString &name, const QVariant &value);
    /**
     * @brief updatePosition 是否隐藏
     * @param name 属性名称
     * @param value bool值
     * @return 是否更新成功
     */
    bool updateIsVisible(const QString &name, const QVariant &value);


    // QGraphicsItem interface
protected:
    /**
     * @brief itemChange 图形改变
     * @param change 枚举类型
     * @param value
     * @return
     */
    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
};

#endif // GY_CLIPPINGREGION_H
